<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // class Num {

        // } // 声明 class 类模板
        // var a = new Num() // 创建实例化 class 对象
        // console.log(a) // 结果：Num {}

        // class Num {
        //     constructor(name,age) {
        //         this.name = name,
        //         this.age = age
        //     }
        // } // 声明 class 类模板
        // var a = new Num('亡灵天灾圣法神伊莱克斯',100) // 创建实例化 class 对象
        // console.log(a) // 结果：Num {name: '亡灵天灾圣法神伊莱克斯', age: 100}
        // var b = new Num('情绪之神霍雨浩',100) // 创建实例化 class 对象
        // console.log(b) // 结果：Num {name: '情绪之神霍雨浩', age: 100}

        // class Num {
        //     constructor(name,age) {
        //         this.name = name,
        //         this.age = age
        //     }
        // } // 声明 class 类模板
        // class Boo extends Num{

        // } // 声明 class 类模板
        // var a = new Boo('荒天帝',100) // 创建实例化 class 对象
        // console.log(a) // 结果：Boo {name: '荒天帝', age: 100}

        // class Num {
        //     constructor(name, age) {
        //         this.name = name,
        //             this.age = age
        //     }
        // } // 声明 class 类模板
        // class Boo extends Num {
        //     constructor(name, age) {
        //         super(name, age) // 修改this指向
        //         this.name = name,
        //             this.age = age
        //     }
        // } // 声明 class 类模板
        // var a = new Boo('荒天帝', 100) // 创建实例化 class 对象
        // console.log(a) // 结果：Boo {name: '荒天帝', age: 100}

        // class Num {
        //     constructor(name, age) {
        //         this.name = name,
        //             this.age = age
        //     }
        //     get arr() {
        //         console.log('成功获取')
        //         return this.age
        //     }
        //     set arr(bss) {
        //         if (bss <= 100) {
        //             this.age = bss
        //             console.log('成功修改')
        //         } else {
        //             console.log('修改权限被拒绝')
        //         }
        //     }
        // } // 声明 class 类模板
        // var a = new Num('亡灵天灾圣法神伊莱克斯', 100) // 创建实例化 class 对象
        // console.log(a) // 结果：Num {name: '亡灵天灾圣法神伊莱克斯', age: 100}
        // console.log(a.arr)
        // a.arr = 100

        // class Num {
        //     constructor(name, age) {
        //         this.name = name;
        //         this.age = age;
        //     }

        //     get arr() {
        //         console.log('成功获取 arr 属性');
        //         return this.age; // 返回 age 属性值
        //     }

        //     set arr(bss) {
        //         if (bss <= 100) {
        //             this.age = bss;
        //             console.log('成功修改 age 为:', bss);
        //         } else {
        //             console.log('修改权限被拒绝: 值必须 <= 100');
        //         }
        //     }
        // }

        // // 创建实例
        // var a = new Num('亡灵天灾圣法神伊莱克斯', 100);

        // // 正确调用 getter
        // console.log(a.arr); // 输出: 成功获取 arr 属性   100

        // // 正确调用 setter (值 <= 100)
        // a.arr = 50; // 输出: 成功修改 age 为: 50
        // console.log(a.age); // 输出: 50

        // // 尝试设置超过限制的值
        // a.arr = 200; // 输出: 修改权限被拒绝: 值必须 <= 100
        // console.log(a.age); // 输出: 50 (保持原值不变)

        // 数值扩展
        // Number.EPSILON 是 JavaScript 表示的最⼩精度，⼀般⽤来处理浮点数运算。
        // 浮点数比较
        // equal = (x, y) => Math.abs(x - y) < Number.EPSILON // 箭头函数封装比较浮点数，当x-y的差比 Number.EPSILON 还小就忽略掉，并返回true，相反返回false
        // console.log(0.1 + 0.2 === 0.3) // 结果：false
        // console.log(equal(0.11 + 0.21, 0.32)) // 结果：true

        // 二进制以 0b 开头 机制：以二进一 （01）
        // var a = 0b11
        // console.log(a) // 结果：3

        // // 八进制以 0o 开头 机制：以八进一 （01234567）
        // var b = 0o17
        // console.log(b) // 结果：15

        // // 十六进制以 0x 开头 机制：十六进一 （0123456789abcdef）
        // var c = 0xf
        // console.log(c) // 结果：15

        // Number.isFinite 检测⼀个数值是否为有限数。  
        // var a = 1
        // console.log(Number.isFinite(a)) // 结果：true
        // var b = -1
        // console.log(Number.isFinite(b)) // 结果：true
        // var c = Infinity
        // console.log(Number.isFinite(c)) // 结果：false

        // Number.parseInt 和 Number.parseFloat  
        // var a = Number.parseInt === parseInt
        // console.log(a) // 结果：true

        // var b = Number.parseFloat === parseFloat
        // console.log(b) // 结果：true

        // Number.parseInt( ) 从第⼀位开始检查，是数字就转换，直到⼀个不是数字的内容 开头就不是数字，那么直接返回 NaN 不认识⼩数点，只能保留整数 
        // console.log(Number.parseInt('5211314love')) // 结果：5211314
        // Number.parseFloat( ) 从第⼀位开始检查，是数字就转换，直到⼀个不是数字的内容 开头就不是数字，那么直接返回 NaN 认识一次⼩数点
        // console.log(Number.parseFloat('3.1415926神奇')); // 结果：3.1415926

        // Number.isInteger() 判断⼀个数是否为整数。
        // var a = Number.isInteger(5)
        // console.log(a) // 结果：true

        // var b = Number.isInteger(5.20)
        // console.log(b) // 结果：false

        // var c = Number.isInteger(5.0)
        // console.log(c) // 结果：true

        // Math.trunc() 将数字的⼩数部分抹掉。 
        // var a = Math.trunc(3.14)
        // console.log(a) // 结果：3

        // Math.sign()  判断⼀个数到底为正数（正数返回 1） 负数（负数返回 -1） 还是零 （0 返回 0）
        // var a = Math.sign(10)
        // console.log(a) // 结果：1
        // var b = Math.sign(-10)
        // console.log(b) // 结果：-1
        // var c = Math.sign(0)
        // console.log(c) // 结果：0

        // Object.is() ⽅法判断两个值是否完全相同。与 === ⾏为基本⼀致。返回⼀个 Boolean 类型。 
        // var a = 100
        // var b = '100'
        // console.log(Object.is(a, b)) // 结果：false

        // Object.assign()  对象的合并，相当于浅拷⻉。  
        // var obj = {
        //     name: '荒天帝',
        //     age: 18,
        //     sex: ['清漪', '云曦', '火灵儿']
        // }
        // var arr = Object.assign(obj)
        // console.log(arr) // 结果：{ name: '荒天帝', age: 18 }
        // 修改任何一方都会改变
        // arr.age = 20
        // arr.sex = ['']
        // console.log(obj) // { name: '荒天帝', age: 20 }
        // console.log(arr) // 结果：{ name: '荒天帝', age: 20 }

        // 合并对象
        // var a = {
        //     '邪圣王': '大魔王-莫凡'
        // }
        // var b = {
        //     '魔法': {
        //         '火系': '禁咒',
        //         '雷系': '禁咒',
        //         '暗影系': '禁咒',
        //         '召唤系': '禁咒',
        //         '恶魔系': '禁咒',
        //         '空间系': '禁咒',
        //         '土系': '禁咒',
        //         '混沌系': '禁咒',
        //         '冰系': '禁咒',
        //         '风系': '禁咒',
        //         '水系': '禁咒',
        //         '光系': '禁咒',
        //         '音系': '禁咒',
        //     }
        // }
        // var c = Object.assign(a, b)
        // console.log(c)
        // 修改引用数据类型不会改变原对象
        // c['魔法'] = {}
        // console.log(c) // 结果：{ '邪圣王': '大魔王-莫凡', '魔法': {} }
        // console.log(b)
        // 修改基础数据类型会改变原对象
        // c['邪圣王'] = '莫凡'
        // console.log(c) // 结果：{ '邪圣王': '莫凡', '魔法': {} }
        // console.log(a) // 结果：{ '邪圣王': '莫凡', '魔法': {} }

        var arr = {
            name: '死灵圣法神 亡灵天灾 伊莱克斯'
        }
        var str = {
            obj: 100
        }
        // 使用 Object.setPrototypeOf() 设置原型对象
        Object.setPrototypeOf(str, arr) // arr 是 str 的原型对象
        var x = Object.getPrototypeOf(str)
        console.log(x) // 结果：{ name: '死灵圣法神 亡灵天灾 伊莱克斯' }
        console.log(str.name) // 结果：死灵圣法神 亡灵天灾 伊莱克斯
    </script>
</body>

</html>